/**
 * Plugin para deshabiliar un control y animar su background en X
 * @author Sahib Alejandro Jaramillo Leo
 * @version 1.0
 */
(function($)
{
  /**
   * Opciones por defecto
   */
  var Defaults = {
    // Nombre de la clase CSS que se le aplicara al control deshabilitado
    css_class: '',
    // El ancho de la imagen de fondo del control deshabilitado
    bg_image_width: 10,
    // Intervalo de tiempo para la animacion, entre mas pequeño mas rapido
    time_interval: 100
  };
  
  /**
   * Metodos del plugin
   */
  var Methods = {
    
    /**
     * Deshabilita un control y anima su background en X mientras esta
     * deshabiliado
     */
    disable: function(Options)
    {
      // Extender Options con los valores por defecto, sin sobre escribir Defaults
      var Options = $.extend({}, Defaults, Options);
      
      // Iniciar el intervalo de animacion para cada elemento por separado
      this.each(function(i, Element)
      {
        var $Element = $(Element);
        var x = 0;
        var max_x = Options.bg_image_width;
        
        $Element
          // Deshabilitar control
          .attr('disabled', 'disabled')
          // Agregar clase para la animacion
          .addClass(Options.css_class)
          // Guardar sus opciones para accederlas desde el metodo enable
          .data('sahib_disablemation_options', Options)
          // Crear su intervalo de animacion del background
          .data('sahib_disablemation_interval'
            , setInterval(function()
            {
              $Element.css('background-position', (++x) + 'px 0px');
              
              // Reiniciar x para reiniciar el loop de animacion
              if(x == max_x){
                x=0;
              }
            }, Options.time_interval)
          );
      }); 
       
      return this;
    },
    
    /**
     * Habilita un control y detiene la animación del background
     */
    enable: function()
    {
      // Remover la clase css
      return this.each(function(i, Element)
      {
        $(Element)
          // Habilitar control
          .removeAttr('disabled')
          // Remover la clase CSS
          .removeClass($(Element).data('sahib_disablemation_options').css_class);
        
        // Eliminar el intervalo de animacion
        clearInterval($(Element).data('sahib_disablemation_interval'));
      });
    }
  };
  
  /**
   * Define los valores por defecto para las opciones
   */
  $.sahib_disablemation = function(Options)
  {
    Defaults = $.extend(Defaults, Options);
  };
  
  /**
   * Plugin
   */
  $.fn.sahib_disablemation = function(method)
  {
    if(typeof Methods[method] == 'function'){
      return Methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if(typeof method === 'object' || !method){
      return Methods.init.apply(this, arguments);
    } else {
      throw 'Metodo "' + method + '" no existe en jQuery.sahib_disablemation';
    }
  };
  
})(jQuery);